from flask import g
from flask import render_template, current_app, jsonify, abort, session
from flask import request

from info.models import News, User
from info.utils.commons import user_login_data
from info.utils.response_code import RET
from . import news_blue

# 收藏功能接口
# 请求路径: /news/news_collect
# 请求方式: POST
# 请求参数:news_id,action, g.user
# 返回值: errno,errmsg
@news_blue.route('/news_collect', methods=['POST'])
@user_login_data
def news_collect():

    # 0.判断用户登陆状态
    if not g.user:
        return jsonify(errno=RET.PARAMERR, errmsg="用户未登录")

    # 1.获取参数
    news_id = request.json.get("news_id")
    action = request.json.get("action")

    # 2.校验参数
    # 2.1　通过news_id取出新闻对象，判断存在性
    try:
        news =News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)

    if not news:
        return jsonify(errno=RET.NODATA, errmsg="新闻不存在")

    # 2.2　操作类型校验
    if not action in ['collect', 'cancel_collect']:
        return jsonify(errno=RET.DATAERR, errmsg="操作类型有误")

    # 3.操作数据库（收藏，取消收藏）
    if action == "collect":
        if not news in g.user.collection_news:
            g.user.collection_news.append(news)
    else:
        if news in g.user.collection_news:
            g.user.collection_news.remove(news)

    # 4.返回响应
    return jsonify(errno=RET.OK, errmsg="操作成功")

# 新闻详情展示(用户)
# 请求路径: /news/<int:news_id>
# 请求方式: GET
# 请求参数:news_id
# 返回值: detail.html页面, 用户data字典数据
@news_blue.route('/<int:news_id>')
@user_login_data
def news_detail(news_id):

    # # 0,获取session用户编号
    # user_id = session.get("user_id")
    #
    # # 0.1,根据用户编号获取对象
    # user = None
    # if user_id:
    #     user = User.query.get(user_id)


    # 1, 根据新闻编号获取新闻对象
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="获取新闻失败")

    # 2, 判断是否存在
    if not news:
        abort(404)


    # 2,1 判断当前新闻是否在用户的收藏列表中
    is_collected = False  # 假设未收藏

    # 当前用户登陆了, 并且当前新闻在用户的收藏列表中:
    if g.user and news in g.user.collection_news:
        is_collected = True


    # 3, 将新闻对象,转成字典数据
    data = {
        "news_info":news.to_dict(),
        "user_info":g.user.to_dict() if g.user else "",
        "is_collected":is_collected
    }

    # 4,携带数据,渲染页
    return render_template('news/detail.html',data=data)
